package uniandes.cupi2.messengerAmigos.cliente;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;

import sun.font.StrikeCache;

public class ThreadEnvioMensaje extends Thread
{
    private int id;
    IClienteMessenger mundo;
    String nombreGrupo;
    InetAddress inetAddress;
    MulticastSocket multicastSocket;
    public ThreadEnvioMensaje( IClienteMessenger mundo, int id, String nombreGrupo )
    {
        this.mundo = mundo;
        this.id = id;
        this.nombreGrupo = nombreGrupo;

        try
        {
            String dirr = "230.0.0." + id;
            inetAddress = InetAddress.getByName( dirr );
            multicastSocket = new MulticastSocket( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
    }

    public void run( )
    {
        try
        {
            DatagramPacket datagramPacket;
            BufferedReader bf = new BufferedReader( new InputStreamReader( System.in ) );

            while( true )
            {
                String arb = bf.readLine( );
                datagramPacket = new DatagramPacket( arb.getBytes( ), arb.length( ), inetAddress, 7777 );
                multicastSocket.send( datagramPacket );
            }
        }
        catch( Exception e )
        {
            e.printStackTrace( );
        }

    }

    public void enviarMensaje( String mensaje )
    {
        mensaje = nombreGrupo + " => " + mensaje + ";";
        try
        {
            DatagramPacket datagramPacket = new DatagramPacket( mensaje.getBytes( ), mensaje.length( ), inetAddress, 7777 );
            multicastSocket.send( datagramPacket );
        }
        catch( UnknownHostException e )
        {
            e.printStackTrace( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }

    }
    public void enviarMensaje2( String mensaje )
    {
        try
        {
            DatagramPacket datagramPacket = new DatagramPacket( mensaje.getBytes( ), mensaje.length( ), inetAddress, 7777 );
            multicastSocket.send( datagramPacket );
        }
        catch( UnknownHostException e )
        {
            e.printStackTrace( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
    }
    private void enviarBytes( byte[] byteArray )
    {
        try
        {
            DatagramPacket datagramPacket = new DatagramPacket( byteArray, byteArray.length, inetAddress, 7777 );
            multicastSocket.send( datagramPacket );
        }
        catch( UnknownHostException e )
        {
            e.printStackTrace( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
    }

    public void enviarArchivo( String absolutePath )
    {

        try
        {
            File myFile = new File( absolutePath );

            FileInputStream bis = new FileInputStream( absolutePath );
            enviarMensaje2( "ARCHIVO:" + myFile.getName( ) );
            int numpaquete = 901;

            byte[] byteArray = new byte[Grupo.SIZE];
            System.out.println( absolutePath );
            while( ( bis.read( byteArray, 0, byteArray.length - 2 ) ) != -1 )
            {
                String paquete = "" + numpaquete;
                String a = paquete.charAt( 1 ) + "";
                String b = paquete.charAt( 2 ) + "";
                byteArray[ Grupo.SIZE - 2 ] = a.getBytes( )[ 0 ];
                byteArray[ Grupo.SIZE - 1 ] = b.getBytes( )[ 0 ];
                enviarBytes( byteArray );
                System.out.print( "E: " + a + b );
                byteArray = new byte[Grupo.SIZE];
                numpaquete++;
                Thread.sleep( 100 );
            }
            // bis.read( mybytearray, 0, mybytearray.length );
            enviarMensaje2( "FIN_ARCHIVO:" + ( numpaquete - 901 ) );
            bis.close( );
        }
        catch( FileNotFoundException e )
        {
            e.printStackTrace( );
        }
        catch( IOException e )
        {
            e.printStackTrace( );
        }
        catch( InterruptedException e )
        {
            e.printStackTrace( );
        }

    }
}